package com.bestcem.xm.user.dao;

import com.bestcem.xm.user.entity.mysql.Organization;
import com.bestcem.xm.user.entity.pojo.ListOrgByPageDO;
import com.bestcem.xm.user.entity.pojo.ListOrgsByFilterDO;
import com.bestcem.xm.user.entity.pojo.OrganizationDO;
import com.bestcem.xm.user.grpc.service.param.ListOrgsByPagingParam;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 公司管理对象服务
 *
 * @author qiongyu.cui <qiongyu.cui@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/1 14:59
 */
public interface OrganizationDao {

    /**
     * 根据orgId更新Organization
     *
     * @param organizationDO
     * @return java.lang.Boolean
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/2 17:22
     */
    Boolean updateByPrimaryKeySelective(OrganizationDO organizationDO);

    /**
     * 根据id查询机构信息
     *
     * @param id 机构id
     * @return com.bestcem.xm.om.entity.mongo.readonly.UserOrganization
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2021/12/2 11:41
     */
    Organization findById(String id);

    /**
     * 全量更新organization
     *
     * @param organizationDO
     * @return java.lang.Boolean
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/11 11:42
     */
    Boolean updateByPrimaryKey(OrganizationDO organizationDO);

    /**
     * 获取公司信息
     *
     * @param orgId
     * @return 公司信息
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/01 17:30
     */
    OrganizationDO selectByPrimaryKey(String orgId);

    /**
     * 获取公司信息
     *
     * @param orgId  公司id
     * @param status 公司状态
     * @return com.bestcem.xm.user.entity.mysql.Organization
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/03 16:55
     */
    OrganizationDO getOrgInfo(String orgId, Integer status);

    /**
     * 根据orgCode查询公司基础信息
     *
     * @param orgCode 公司代号
     * @return com.bestcem.xm.user.entity.pojo.OrganizationDO
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 14:23
     */
    OrganizationDO selectByOrgCode(String orgCode);

    /**
     * 根据公司id列表查询公司列表信息
     *
     * @param orgIds 公司id列表
     * @param status 状态
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.OrganizationDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/08 11:29
     */
    List<OrganizationDO> selectByIdsAndStatus(List<String> orgIds, Integer status);

    /**
     * 创建公司
     *
     * @param organizationDO
     * @return String
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/8 20:55
     */
    String insertSelective(OrganizationDO organizationDO);

    /**
     * 根据公司id列表查询公司code列表
     *
     * @param orgIds 公司id列表
     * @return java.util.List<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/08 17:01
     */
    List<String> selectOrgCodesByIds(List<String> orgIds);

    /**
     * 根据公司id批量获取公司信息
     *
     * @param orgIdSet 公司id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/5/11 13:45
     */
    List<OrganizationDO> selectByOrgIds(Set<String> orgIdSet);

    /**
     * 获取套餐过期的公司
     *
     * @param packType 套餐类型
     * @param orgStatusList 状态列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    List<OrganizationDO> getExpirePackOrg(String packType, List<Integer> orgStatusList);

    /**
     * 根据今日日期查询正式套餐还有30天就过期的公司
     *
     * @param time   当前时间
     * @param status 公司状态
     * @return List<OrganizationDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/03/10 11:00
     */
    List<OrganizationDO> getByfomalExpiryTime(LocalDateTime time, List<Integer> status);

    /**
     * 可选参数查询
     *
     * @param organizationDO
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.OrganizationDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/21 20:40
     */
    List<OrganizationDO> selectBySelective(OrganizationDO organizationDO);

    /**
     * 更新未停用且套餐过期的公司
     *
     * @param inactivated
     * @param expired
     * @param expireTime
     * @param yesterday
     * @return
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    Integer updatePackGteTodayOrg(Integer inactivated, Integer expired, Date expireTime, Date yesterday);

    /**
     * 更新停用且套餐过期的公司
     *
     * @param inactivated
     * @param expired
     * @param expireTime
     * @return
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    Integer updatePackLteTodayOrg(Integer inactivated, Integer expired, Date expireTime);

    /**
     * 更新未完善信息的公司
     *
     * @param complete
     * @param noComplete
     * @return
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    Integer updateCompleteFlag(Integer complete, Integer noComplete);

    /**
     * 获取所有organization信息
     *
     * @param
     * @return 公司信息
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/01 17:30
     */
    List<OrganizationDO> getAllOrg();


    /**
     * 租户管理分页获得公司信息
     *
     * @param pageDO
     * @param organizationDO
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.OrganizationDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/16 21:07
     */
    List<OrganizationDO> listOrganizationsByPage(ListOrgByPageDO pageDO, OrganizationDO organizationDO);

    /**
     * 租户管理分页获得公司信息数量统计
     *
     * @param pageDO
     * @param organizationDO
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/17 11:42
     */
    Integer listOrganizationsByPageCount(ListOrgByPageDO pageDO, OrganizationDO organizationDO);

    /**
     * 根据package_ids查询租户id列表
     *
     * @param packageIdsList 套餐id列表
     * @return java.util.List<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/5/17 15:30
     */
    List<String> selectOrgIdsByPackageIds(List<String> packageIdsList);

    /**
     * 根据搜索条件查询公司列表
     *
     * @param organizationDO 组织条件DTO
     * @param statuses       组织状态
     * @param search         公司编码，公司名称模糊查询条件
     * @param tableFields    限定返回字段
     * @param limit          限定返回行数
     * @return 组织条件DO
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 16:04 2022/6/28
     */
    List<OrganizationDO> listOrganizations(OrganizationDO organizationDO, List<Integer> statuses, String search, String tableFields, Integer limit);


    /**
     * 根据筛选条件筛选公司信息
     *
     * @param pageDO
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.OrganizationDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 16:24
     */
    List<OrganizationDO> listOrgsByFilter(ListOrgsByFilterDO pageDO);


    /**
     * 根据筛选条件筛选公司信息总数
     *
     * @param pageDO
     * @return java.lang.Long
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 16:26
     */
    Long listOrgsByFilterCount(ListOrgsByFilterDO pageDO);

    /**
     * 根据公司code集合查询公司
     *
     * @param orgCodes
     * @return List<OrganizationDO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/7/5 18:02
     */
    List<OrganizationDO> listByOrgCodes(List<String> orgCodes);

    /**
     * 查询inner_flag为空的租户id列表
     *
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.OrganizationDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:17
     */
    List<OrganizationDO> selectByInnerFlagIsNull();

    /**
     * 将所有inner_flag为空的租户的inner_flag更新为false
     *
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:09
     */
    void updateInnerFlagIsNullToFalse();

    /**
     * 根据orgId列表更新innerFlag字段
     *
     * @param orgIds    租户id
     * @param innerFlag 内部用户标识
     * @return void
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:36
     */
    void updateInnerFlagByOrgIds(List<String> orgIds, Integer innerFlag);


    /**
     * 根据 orgId 更新钱包id
     *
     * @param orgId    租户id
     * @param walletId 钱包id
     * @return int
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/8/1 15:07
     */
    int updateCorpWalletByOrgId(String orgId, String walletId);

    /**
     * 根据 code 统计数量
     *
     * @param code
     * @return int
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/8/4 13:56
     */
    int countByCode(String code);

    /**
     * 查询租户总量
     *
     * @param organizationDO
     * @param param
     * @param limit
     * @param offset
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 11:20
     */
    Integer baseCount(OrganizationDO organizationDO, ListOrgsByPagingParam param, Integer limit, Integer offset);

    /**
     * 分页查询租户
     *
     * @param organizationDO
     * @param param
     * @param limit
     * @param offset
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.OrganizationDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 11:21
     */
    List<OrganizationDO> listOrgsByPaging(OrganizationDO organizationDO, ListOrgsByPagingParam param, Integer limit, Integer offset);

    /**
     * 查询所有机构id
     *
     * @return java.util.List<java.lang.String>
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/7/27 10:54
     */
    List<String> listAllIds();
}
